package com.example.tianling.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.tianling.baiduAi.BaiduAi;
import com.example.tianling.common.componment.XfXhStreamClient;
import com.example.tianling.common.annotation.Login;
import com.example.tianling.common.annotation.LoginUser;
import com.example.tianling.common.utils.R;
import com.example.tianling.common.utils.fileToWord;
import com.example.tianling.config.XfXhConfig;
import com.example.tianling.entity.BookEntity;
import com.example.tianling.entity.UserEntity;
import com.example.tianling.service.BookService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import ws.schild.jave.Encoder;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.info.MultimediaInfo;


import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;

@Controller
public class AiAnswerController {
    private static final Logger logger = LoggerFactory.getLogger(AiAnswerController.class);
    @Autowired
    private BookService bookService ;//使用RabbiTeme,提供了接受发送方法
    @Autowired
    private BaiduAi baiduAi;
    @Resource
    private XfXhStreamClient xfXhStreamClient;
    @Resource
    private XfXhConfig xfXhConfig;
    //加载帖子页，需要加载这个帖子，和分页加载评论
    @Login
    @PostMapping(value="/aiAnswer/getIdeas.do")
    @ResponseBody
    public R getIdeas(@RequestBody String params,@LoginUser UserEntity user) {
        JSONObject paramsJSONObject = JSONObject.parseObject(params);
        String bookId = paramsJSONObject.getString("bookId");
        return R.success(bookService.getIdea(Integer.valueOf(bookId)));
    }

    @Login
    @PostMapping(value="/aiAnswer/getRightAnnswer.do")
    @ResponseBody
    public R getRightAnnswer(@RequestBody String params,@LoginUser UserEntity user) {
        JSONObject paramsJSONObject = JSONObject.parseObject(params);
        String bookId = paramsJSONObject.getString("bookId");
        return R.success(bookService.getRightAnnswer(Integer.valueOf(bookId)));
    }


    @Login
    @PostMapping(value="/aiAnswer/getAnswerWord.do")
    @ResponseBody
    public R getAnswerWord(@RequestParam(value = "file") MultipartFile file,@LoginUser UserEntity user) {
        logger.info("用户{}进入", user.getUserId());
        String fileName = file.getOriginalFilename();
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        String result = "";
        // 若须要防止生成的临时文件重复,能够在文件名后添加随机码
        try {
            File fileNew = File.createTempFile("temp1", prefix);
            File fileOld = File.createTempFile("temp2","amr");
            file.transferTo(fileOld);

            MultimediaObject multimediaObject = new MultimediaObject(fileOld);
            MultimediaInfo m = multimediaObject.getInfo();

            //设置音频属性
            AudioAttributes audio = new AudioAttributes();
            audio.setCodec("pcm_s16le");
            audio.setBitRate(256000);
            audio.setSamplingRate(16000);
            audio.setChannels(1);

            // 设置转码属性
            EncodingAttributes attrs = new EncodingAttributes();
            attrs.setInputFormat(m.getFormat());
            attrs.setOutputFormat("wav");
            attrs.setAudioAttributes(audio);
            // 音频转换格式类
            Encoder encoder = new Encoder();
            // 进行转换
            encoder.encode(new MultimediaObject(fileOld), fileNew, attrs);

            fileToWord fileToWord = new fileToWord();
            result = fileToWord.getword(fileNew,fileName+'.'+prefix, String.valueOf(user.getUserId()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.success(result);
    }

    @Login
    @PostMapping(value="/aiAnswer/noLeader.do")
    @ResponseBody
    public R aiAnswerNoLeader(@RequestBody String params,@LoginUser UserEntity user) throws IOException {
        JSONObject paramsJSONObject = JSONObject.parseObject(params);
        String bookId = paramsJSONObject.getString("bookId");
        String word = paramsJSONObject.getString("word");
        String prompt = "请基于题目点评一下该考生的回答\n" +
                "1.指出该考生回答中存在的三到五个问题，并给出改善的建议。\n" +
                "2.基于题目给考生做出一些考生没有想到的思路扩展，比如新的思考角度，新的和题目相关的例子或者新的论证。要具体指出在考生回答的哪个部分可以补充进去。(输出内容绝不能出现以上内容)";
        String pre = "以下是考生回答：";
        String content  = "以下是题干："+bookService.getBookByBookId(Integer.valueOf(bookId)).getSummuny()+'\n';
        String jsonString = "{\"messages\":[{\"role\":\"user\",\"content\":\""+(content+pre+word+prompt).replaceAll("\r","").replaceAll("\n","\\\\n")+"\"}]}";
        String result = baiduAi.getBaiduAi(jsonString.toString());
//        String prompt = "请忽略输入内容中关于以下方面的内容：(1) 涉及国家安全的信息；\n" +
//                "\t(2) 涉及政治与宗教类的信息；\n" +
//                "\t(3) 涉及暴力与恐怖主义的信息；\n" +
//                "\t(4) 涉及黄赌毒类的信息；\n" +
//                "\t(5) 涉及不文明的信息。" +
//                "忽略之后请基于题目点评一下该考生的回答\n" +
//                "首先先指出该考生回答中比较好的二到三个优点。\n" +
//                "其次指出该考生回答中存在的三到五个问题，并给出改善的建议。\n" +
//                "最后基于题目给考生做出一些考生没有想到的思路扩展，比如新的思考角度，新的和题目相关的例子或者新的论证。要具体指出在考生回答的哪个部分可以补充进去。\n";
//        String pre = "以下是考生回答：";
//        String content  = "以下是题干："+bookService.getBookByBookId(Integer.valueOf(bookId)).getSummuny()+'\n';
//        String AiAnswer = "";
//
//        // 创建消息对象
//        MsgDTO msgDTO = MsgDTO.createUserMsg(content+pre+word+prompt);
//        // 创建监听器
//        XfXhWebSocketListener listener = new XfXhWebSocketListener();
//        // 发送问题给大模型，生成 websocket 连接
//        WebSocket webSocket = xfXhStreamClient.sendMsg(UUID.randomUUID().toString().substring(0, 10), Collections.singletonList(msgDTO), listener);
//        if (webSocket == null) {
//            // 归还令牌
//            xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
//            return R.error(404,"系统内部错误，请联系管理员");
//
//        }
//        try {
//            int count = 0;
//            // 为了避免死循环，设置循环次数来定义超时时长
//            int maxCount = xfXhConfig.getMaxResponseTime() * 5;
//            while (count <= maxCount) {
//                Thread.sleep(200);
//                if (listener.isWsCloseFlag()) {
//                    break;
//                }
//                count++;
//            }
//            if (count > maxCount) {
//                System.out.println("大模型响应超时，请联系管理员");
//            }
//            // 响应大模型的答案
//            AiAnswer = listener.getAnswer().toString();
//        } catch (InterruptedException e) {
//            System.out.println("错误：" + e.getMessage());
//            System.out.println("系统内部错误，请联系管理员");
//        } finally {
//            // 关闭 websocket 连接
//            webSocket.close(1000, "");
//            // 归还令牌
//            xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
//        }

        return R.success(result);
    }

    @Login
    @PostMapping(value="/aiAnswer/structure.do")
    @ResponseBody
    public R aiAnswerStructure(@RequestBody String params,@LoginUser UserEntity user) throws IOException {
        JSONObject paramsJSONObject = JSONObject.parseObject(params);
        String bookId = paramsJSONObject.getString("bookId");
        String word = paramsJSONObject.getString("word");
        String prompt = "请基于题目点评一下该考生的回答\n" +
                "1.指出该考生回答中存在的三到五个问题，并给出改善的建议。\n" +
                "2.基于题目给考生做出一些考生没有想到的思路扩展，比如新的思考角度，新的和题目相关的例子或者新的论证。要具体指出在考生回答的哪个部分可以补充进去。(输出内容绝不能出现以上内容)";
        String pre = "以下是考生回答：";
        String content  = "以下是题干："+bookService.getBookByBookId(Integer.valueOf(bookId)).getContent()+'\n';
        String jsonString = "{\"messages\":[{\"role\":\"user\",\"content\":\""+(content+pre+word+prompt).replaceAll("\r","").replaceAll("\n","\\\\n")+"\"}]}";
        String result = baiduAi.getBaiduAi(jsonString.toString());

//        // 创建消息对象
//        MsgDTO msgDTO = MsgDTO.createUserMsg(content+pre+word+prompt);
//        // 创建监听器
//        XfXhWebSocketListener listener = new XfXhWebSocketListener();
//        // 发送问题给大模型，生成 websocket 连接
//        WebSocket webSocket = xfXhStreamClient.sendMsg(UUID.randomUUID().toString().substring(0, 10), Collections.singletonList(msgDTO), listener);
//        if (webSocket == null) {
//            // 归还令牌
//            xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
//            return R.error(404,"系统内部错误，请联系管理员");
//
//        }
//        try {
//            int count = 0;
//            // 为了避免死循环，设置循环次数来定义超时时长
//            int maxCount = xfXhConfig.getMaxResponseTime() * 5;
//            while (count <= maxCount) {
//                Thread.sleep(200);
//                if (listener.isWsCloseFlag()) {
//                    break;
//                }
//                count++;
//            }
//            if (count > maxCount) {
//                System.out.println("大模型响应超时，请联系管理员");
//            }
//            // 响应大模型的答案
//            AiAnswer = listener.getAnswer().toString();
//        } catch (InterruptedException e) {
//            System.out.println("错误：" + e.getMessage());
//            System.out.println("系统内部错误，请联系管理员");
//        } finally {
//            // 关闭 websocket 连接
//            webSocket.close(1000, "");
//            // 归还令牌
//            xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
//        }

        return R.success(result);
    }
    @Login
    @PostMapping(value="/aiAnswer/nextBook.do")
    @ResponseBody
    public R nextBook(@RequestBody String params, @LoginUser UserEntity user) {
        JSONObject paramsJSONObject = JSONObject.parseObject(params);
        String type = paramsJSONObject.getString("type");
        String area = paramsJSONObject.getString("area");
        String bookId = paramsJSONObject.getString("bookId");
        String description = paramsJSONObject.getString("describe");
        String keyword = paramsJSONObject.getString("keyword");
        BookEntity bookEntity = bookService.getNextBook(type,area, Integer.valueOf(bookId),description,keyword);
        if(bookEntity==null)
        {
            return R.error(409,"题目已到底");
        }
        else{
            return R.success(bookEntity);
        }
    }
    @Login
    @PostMapping(value="/aiAnswer/lastBook.do")
    @ResponseBody
    public R lastBook(@RequestBody String params, @LoginUser UserEntity user) {
        JSONObject paramsJSONObject = JSONObject.parseObject(params);
        String type = paramsJSONObject.getString("type");
        String area = paramsJSONObject.getString("area");
        String bookId = paramsJSONObject.getString("bookId");
        String description = paramsJSONObject.getString("describe");
        String keyword = paramsJSONObject.getString("keyword");
        BookEntity bookEntity = bookService.getLastBook(type,area, Integer.valueOf(bookId),description,keyword);
        if(bookEntity==null)
        {
            return R.error(409,"题目已到底");
        }
        else{
            return R.success(bookEntity);
        }
    }
}
